/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package Map;

import Collection接口.Person;
import org.junit.Test;

import java.util.*;

/**
 * @description Map接口
 *      用于存储双列数据 key-value对 类似于函数、映射
 *      key         类似用Set储存            无序   不可重复    要求key所在类重写hashcode()和equals()方法
 *      value       类似用Collection储存     无序   可重复     要重写equals()方法
 *        一个key一个value构成了一个Entry对象
 *      entry       类似用Set储存            无序   不可重复
 *
 *       添加、删除、修改操作：
 *       Object put(Object key,Object value)：将指定key-value添加到(或修改)当前map对象中
 *       void putAll(Map m):将m中的所有key-value对存放到当前map中
 *       Object remove(Object key)：移除指定key的key-value对，并返回value
 *       void clear()：清空当前map中的所有数据
 *
 *       元素查询的操作：
 *       Object get(Object key)：获取指定key对应的value
 *       boolean containsKey(Object key)：是否包含指定的key
 *       boolean containsValue(Object value)：是否包含指定的value
 *       int size()：返回map中key-value对的个数
 *       boolean isEmpty()：判断当前map是否为空
 *       boolean equals(Object obj)：判断当前map和参数对象obj是否相等
 *
 *       元视图操作的方法：
 *       Set keySet()：返回所有key构成的Set集合
 *       Collection values()：返回所有value构成的Collection集合
 *       Set entrySet()：返回所有key-value对构成的Set集合
 *
 * @author 俊昭
 * @date 2022/4/20
*/
public class MapTest {
    @Test
    public void test03(){
        Map map = new HashMap();
        map.put(101,"AAA");
        map.put(110,"ABc");
        map.put(139,"AaA");
        map.put(123,"BDA");
        map.put(145,"Abc");

        System.out.println("map的所有key:");
        Set keys = map.keySet();// HashSet
        for (Object key : keys) {
            System.out.println(key + "->" + map.get(key));
        }

        System.out.println("map的所有的value：");
        Collection values = map.values();
        Iterator iter = values.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }

        System.out.println("map所有的映射关系：");
        // 映射关系的类型是Map.Entry类型，它是Map接口的内部接口
        Set mappings = map.entrySet();
        for (Object mapping : mappings) {
            Map.Entry entry = (Map.Entry) mapping;// Enter是Map的子类实际上就是由他储存的数据
            System.out.println("key是：" + entry.getKey() + "，value是：" + entry.getValue());

        }
    }
    @Test
    public void test02(){// 查、元视图操作
        Map m1 = new HashMap();
        Map m2 = new HashMap();
        m1.put(123,null);
        m1.put(124,new Person("AAA",17));
        m1.put(125,123);
        m1.put(126,true);

        Map m3 = new HashMap();
        m3.put(123,null);
        m3.put(124,new Person("AAA",17));
        m3.put(125,123);
        m3.put(126,true);

        System.out.println(m1);// {123=true, 124=Person{name='AAA', age=17}, 125=123}

        // Object get(Object key)：获取指定key对应的value
        Object o;
        o = m1.get(123);
        System.out.println(o);// null
        o = m1.get(124);
        System.out.println(o);// Person{name='AAA', age=17}
        o = m1.get(122);
        System.out.println(o);// null 没有对应的key则返回null

        // boolean containsKey(Object key)：是否包含指定的key
        System.out.println(m1.containsKey(123));// true
        System.out.println(m1.containsKey(122));// false

        // int size()：返回map中key-value对的个数
        System.out.println(m1.size());// 4
        System.out.println(m2.size());// 0
        // boolean isEmpty() map是否为空
        System.out.println(m1.isEmpty());// false
        System.out.println(m2.isEmpty());// true

        // boolean equals(Object obj)：判断当前map和参数对象obj是否相等
        System.out.println(m1.equals(m2));// false
        System.out.println(m1.equals(m3));// true

        // Set keySet()：返回所有key构成的Set集合
        Set s1 = m1.keySet();
        System.out.println(s1);// [123, 124, 125, 126]
        // Collection values()：返回所有value构成的Collection集合
        Collection c1 = m1.values();
        System.out.println(c1);// [null, Person{name='AAA', age=17}, 123, true]

        // Set entrySet()：返回所有key-value对构成的Set集合
        s1 = m1.entrySet();
        System.out.println(s1);// [123=null, 124=Person{name='AAA', age=17}, 125=123, 126=true]


    }

    @Test
    public void test01(){// 添、删、改
        // 创建一个Map
        Map m1 = new HashMap();

        // Object put(Object key,Object value)：将指定key-value添加到(或修改)当前map对象中
        // 如果已有key 则value值会更新为后存入的
        m1.put(null,123);// m1 = new Hashtable();加入null报空指针异常
        m1.put(123,null);
        System.out.println(m1);// {null=123, 123=null}

        // void putAll(Map m):将m中的所有key-value对存放到当前map中
        Map m2 = new HashMap();
        m2.put(124,new Person("AAA",17));
        m2.put(100,new Person("Aba",12));
        m1.putAll(m2);
        System.out.println(m1);
        // {null=123, 100=Person{name='Aba', age=12}, 123=null, 124=Person{name='AAA', age=17}}

        // Object remove(Object key)：移除指定key的key-value对，并返回value
        System.out.println(m1.remove(100));// Person{name='Aba', age=12}
        System.out.println(m1);// {null=123, 123=null, 124=Person{name='AAA', age=17}}

        // void clear()：清空当前map中的所有数据
        m2.clear();
        System.out.println(m2);// {}



    }

}
